#include <iostream>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/RollingFileAppender.hh>
#include <log4cpp/Category.hh>
using std::cout;
using std::endl;
using namespace log4cpp;

//输出到控制台
void test(){
    OstreamAppender * oap1 = new OstreamAppender("console", &cout);
    oap1->setLayout(new BasicLayout());

    Category & root = Category::getRoot();
    root.setPriority(Priority::DEBUG);
    root.setAppender(oap1);
    //上述代码已经将四个组件串了起来
    //记录日志即可
    root.alert("this is an alert message");
    root.debug("this is a debug message");
    root.info("this is an info message");
    root.emerg("this is an emerg message");
}
//输出到文件中
//此时fileAppender的缺点在哪？？？？？
//一直持续不断地追加，运行时间久了之后，文件会非常非常的大
//读写都会非常的慢
//希望隔段时间、固定大小会产生一个新的文件
void test2(){
    FileAppender * ap1 = new FileAppender("file", "wd.log");
    ap1->setLayout(new BasicLayout());

    //静态成员函数
    Category & root = Category::getRoot();
    root.setPriority(Priority::INFO);
    root.setAppender(ap1);
    //最终日志文件中只有三条日志信息
    //但是输出的是四条信息
    //主要的原因在于日志本身是有一个级别
    //当前日志系统设置了一个级别
    //只有当日志本身的级别高于系统的日志级别阈值时，才会输出
    //当前系统中设置的是INFO，但是有一条日志级别是DEBUG，低于INFO
    root.alert("this is an alert message");
    root.debug("this is a debug message");
    root.info("this is an info message");
    root.emerg("this is an emerg message");
}

//滚动日志文件
//滚动文件是如何产生的？？？？？
//第一个参数表示的是名称，可有无可
//第二个参数表示的是文件的名称
//第三个参数表示的是每个文件的大小，单位是字节，到达大小之后便产生滚动
//生成一个新的文件
//第四个参数表示的备份文件的个数，其实就是rolling.log.后面的数字一个有多少个
//如何滚动的呢？
//刚开始的时候只有rolling.log文件，当这个文件满了之后
//该文件变成了rolling.log.1文件，新的数据会写入到rolling.log文件中
//当这个rolling.log满了之后呢,原来的rolling.log.1变成rolling.log.2
//新的rolling.log变成rolling.log.1
//以此类推.....直至最后到达备份个数之后，更久远的数据便会被清除
void test3(){
    RollingFileAppender * rap1 = new RollingFileAppender("roll",
                                                         "rolling.log",
                                                         1024 * 1024,
                                                         9);
    rap1->setLayout(new BasicLayout());

    Category & root = Category::getRoot();
    root.setPriority(Priority::INFO);
    root.setAppender(rap1);
    for(int i = 0; i < 40000; ++i){
        root.alert("this is an alert message" + std::to_string(i));
        root.debug("this is a debug message" + std::to_string(i));
        root.info("this is an info message" + std::to_string(i));
        root.emerg("this is an emerg message" + std::to_string(i));
    }
}

int main()
{
    test3();
    return 0;
}

